package com.wjm.api.ReflectPackage;

import java.lang.reflect.Constructor;

/**
 * Data:2022年07月30日
 * Author:wjm
 * Content: Reflect反射机制（对构造方法的操作）
 *
 *
 *  获取构造方法：
 *         1）Constructor<?>[] getConstructors()
 *                     获得修饰权限为public的所有构造函数，返回数组
 *         2）Constructor<T> getConstructors(Class<?>...parameterTypes)
 *                     获得指定参数并权限修饰符为public的构造方法，这里的参数需要传参数类型的Class对象
 *         3）Constructor<?>[] getDeclaredConstructors()
 *                     获得所有的构造函数，不需要关注权限修饰符，返回数组
 *         4）Constructor<T> getDeclaredConstructors(Class<?>...parameterTypes)
 *                     获得指定参数的构造方法，无需在意它的修饰符权限，这里的参数需要传参数类型的Class对象
 *
 *   创建对象的方法：
 *         public T newInstance(Object...initargs)
 *                    创建此 Class 对象所表示的类的一个新实例。这里传的参数类型要与调用该方法的构造函数括号的参数类型对应
 *         注意：
 *                    如果使用空参构造方法创建对象，操作可简化为：Class对象的newInstance方法
 *
 */
public class ReflectDemo2 {
    public static void main(String[] args) throws Exception {
        //先获取类对象
        Class c = Car.class;

        //获得指定参数并权限修饰符为public的构造方法
        Constructor constructor1 = c.getConstructor(int.class,String.class,double.class);
        //获得指定参数并权限修饰符为public的构造方法
        Constructor constructor2 = c.getConstructor(int.class,String.class);
        //获得指定参数并权限修饰符为public的构造方法
        Constructor constructor3 = c.getConstructor();
        System.out.println(constructor1);
        System.out.println(constructor2);
        System.out.println(constructor3);
        System.out.println("----------------------------------");

        //获得修饰权限为public的所有构造函数，返回数组
        Constructor[] constructors = c.getConstructors();

        for (Constructor co:constructors){
            System.out.println(co);
        }
        System.out.println("-------------------------------------");

        //使用constructor1创建对象
        Object obj1 = constructor1.newInstance(99999,"兰博基尼",1000000.01);
        System.out.println(obj1);
        //使用constructor2创建对象
        Object obj2 = constructor2.newInstance(88888,"法拉利");
        System.out.println(obj2);
        //使用constructor3创建对象
        Object obj3 = constructor3.newInstance();
        System.out.println(obj3);
        //等价与使用空参构造方法构造对象，即等价于使用constructor3创建对象
        Object obj4 = c.newInstance();
        System.out.println(obj4);

        /*
        * java.lang.IllegalArgumentException (参数化异常)
        *
        * Object obj5 = constructor2.newInstance(88888,"法拉利",10.01);
        * 因为constructor2对应的是Car(int,java.lang.String)构造方法，如果参数个数不一样或者类型不一致都会报这个错误
        * */





    }
}
